João Távora [Sun, 20 May 2018 14:24:55 +0000 (15:24 +0100)]
Get rid of jsonrpc.el customization group and timeout
* eglot.el (eglot-shutdown, eglot--signal-textDocument/willSave):
Pass :timeout to jsonrpc-request.
(defadvice jsonrpc-request): Add :timeout kwarg
* jsonrpc.el (defgroup jsonrpc, jsonrpc-request-timeout): Remove.
(jrpc-default-request-timeout): New constant.
(jsonrpc-async-request): Use it.
(jsonrpc-request): Accept timeout kwarg and pass it on.
João Távora [Sun, 20 May 2018 14:07:23 +0000 (15:07 +0100)]
Heroically merge master into jsonrpc-refactor (using imerge)
João Távora [Sun, 20 May 2018 12:21:12 +0000 (13:21 +0100)]
Rename jrpc.el to jsonrpc.el
* eglot.el [everywhere]: jrpc -> jsonrpc everywhere.
Reindent.
* eglot-tests [everywhere]: jrpc -> jsonrpc everywhere.
* jsonrpc.el: New file.
* Makefile: jrpc.el -> jsonrpc.el
João Távora [Sat, 19 May 2018 23:44:21 +0000 (00:44 +0100)]
Fix a bug introduced in the previous commit
* eglot.el (eglot--format-markup): Ignore errors when calling
possibly unknown functions.
(eglot-completion-at-point): Use eglot--format-markup
(eglot--hover-info): Yak shaving
João Távora [Sat, 19 May 2018 23:35:11 +0000 (00:35 +0100)]
Rewrite a couple of defs and shave a yak
* eglot.el (eglot--define-process-var): Simplify.
(eglot--format-markup): Rewrite.
(eglot--warn, eglot--pos-to-lsp-position)
(eglot--lsp-position-to-point, eglot--server-capable)
(eglot--maybe-activate-editing-mode)
(eglot--server-textDocument/publishDiagnostics)
(eglot--server-workspace/applyEdit, eglot--hover-info): Yak
shaving.
João Távora [Sat, 19 May 2018 22:41:14 +0000 (23:41 +0100)]
* eglot.el (version): bump to 0.4
João Távora [Sat, 19 May 2018 16:04:46 +0000 (17:04 +0100)]
Add some completion tests for pyls
* eglot-tests.el (edebug): Require it.
(eglot--call-with-dirs-and-files): Simplify.
(eglot--call-with-test-timeout): Don't timeout if edebug.
(auto-detect-running-server, auto-reconnect): Skip unless rls is
found.
(basic-completions): New test.
(hover-after-completions): New failing test.
* eglot.el (eglot-eldoc-function): Force write
eldoc-last-message, for tests sake.
João Távora [Sat, 19 May 2018 15:50:09 +0000 (16:50 +0100)]
Handle managed buffers in own process var
This should save some trouble when testing noninteractively. Because
eglot--shutdown didn't turn off the minor mode, test code running
immediately after it could still make didClose requests, for example.
The sentinel was the previous responsible for turning off the minor
mode and didn't get a chance to run in that case. Now eglot--shutdown
is also responsible for turning off the minor mode.
All this should be hidden behind eglot--managed-mode-onoff.
* eglot.el (eglot--managed-buffers): New process-local variable.
(eglot--process-sentinel): Turn off managed mode.
(eglot--managed-mode-onoff): New function.
(eglot--managed-mode): Don't offer to kill server here.
(eglot--buffer-managed-p): Remove.
(eglot--maybe-activate-editing-mode): Activate mode here.
(eglot-shutdown): Turn off minor mode here.
(eglot--server-window/progress): Simplify slightly.
João Távora [Sat, 19 May 2018 13:26:46 +0000 (14:26 +0100)]
Robustness fixes for the request mechanism
* eglot.el (eglot--async-request): Pass actual id to eglot--log-event
(eglot--request): Also cancel any continuations.
João Távora [Sat, 19 May 2018 12:45:10 +0000 (13:45 +0100)]
Check capabilities before sending :completionitem/resolve
* eglot.el (eglot--server-capable): Rewrite.
(eglot-completion-at-point): Check caps before sending
:completionItem/resolve
João Távora [Sat, 19 May 2018 12:16:36 +0000 (13:16 +0100)]
Better decide what text exactly to present as completions
For inserting, :insertText takes precedence over :label.
For annotating, first sentence of :documentation, then :detail,
then :kind name.
Also remember to send didChange in the :exit-function
* eglot.el (eglot-completion-function): Rework main function and
:annotation-function, and :exit-function
João Távora [Sat, 19 May 2018 12:12:08 +0000 (13:12 +0100)]
* eglot.el (eglot-clear-status): remember to update modeline
João Távora [Sat, 19 May 2018 10:12:41 +0000 (11:12 +0100)]
Collect regions to change as markers, then edit
* eglot.el (eglot--lsp-position-to-point): Accept MARKER optional
arg.
(eglot--range-region): Accept MARKERS optional arg. Return a list.
(eglot--server-textDocument/publishDiagnostics)
(eglot--hover-info, eglot-eldoc-function): eglot--range-region
returns a list, not a cons.
(eglot--apply-text-edits): First collect regions as markers, then
edit.
GitHub-reference: close https://github.com/joaotavora/eglot/issues/4
João Távora [Sat, 19 May 2018 09:24:18 +0000 (10:24 +0100)]
If we're going to send rootpath, better send an absolute one
javascript-typescript-langserver complained.
* eglot.el (eglot--connect): Use expand-file-name.
João Távora [Sat, 19 May 2018 09:06:12 +0000 (10:06 +0100)]
Robustify timer handling for eglot--async-request
This basically cherry-picks an ealier commit for the jsonrpc-refactor
branch:
a2aa1ed..: João Távora 2018-05-18 Robustify timer handling for jrpc-async-request
* jrpc.el (jrpc--async-request): Improve timeout handling. Return a list (ID TIMER)
(jrpc--request): Protect against user-quits, cancelling timer
João Távora [Sat, 19 May 2018 08:29:52 +0000 (09:29 +0100)]
Simplify some infrastructure fucntions
* eglot.el (eglot--contact): Simplify docstring.
(eglot--make-process): Simplify.
(eglot--connect): Simplify.
(eglot--interactive): Simplify and correct odd bug.
(eglot--process-sentinel): Correct messages. Delete before
attempting reconnection.
(eglot-shutdown): Simplify.
João Távora [Fri, 18 May 2018 15:52:19 +0000 (16:52 +0100)]
Jrpc.el should know nothing of mode-line updates
* eglot.el (eglot--dispatch): METHOD can be a symbol.
Call force-mode-line-update here.
João Távora [Fri, 18 May 2018 11:35:36 +0000 (12:35 +0100)]
Improve jrpc.el's doc (and change jrpc-request's protocol a tiny bit)
* jrpc.el (jrpc-async-request)
(jrpc-request,jrpc-notify,jrpc-reply): Improve docstring.
(jrpc-connect): Improve docstring and add autoload cookie
(jrpc-request): DEFERRED param is now &key
(defgroup jrpc): Fix description.
* eglot.el (advice-add jrpc-request): Use &key deferred.
(eglot-completion-at-point): Pass :deferred to jrpc-request
João Távora [Fri, 18 May 2018 10:57:22 +0000 (11:57 +0100)]
Merge branch 'master' into jsonrpc-refactor (using good ol' git merge)
João Távora [Thu, 17 May 2018 13:09:50 +0000 (14:09 +0100)]
* eglot.el (version): bump to 0.3
João Távora [Thu, 17 May 2018 13:03:20 +0000 (14:03 +0100)]
Make it work on windows
Apparently passing :coding 'no-conversion to make-process on windows
is essential to receive any text at all in the process filter.
Also needed to tweak uri-to-path and path-to-uri.
Thanks to lsp-mode.el for these hints
* eglot.el (eglot--make-process): Pass :coding 'no-conversion to
make-process.
(eglot--path-to-uri): Add a forward slash if windows-nt.
(eglot--uri-to-path): Remove a forward slash if windows-nt.
(eglot--server-textDocument/publishDiagnostics): Simplify and use
eglot--uri-to-path.
João Távora [Thu, 17 May 2018 13:04:15 +0000 (14:04 +0100)]
Fix eglot--error and eglot--message helpers
* eglot.el (eglot--error, eglot--message):
Safely interpret %s.
João Távora [Thu, 17 May 2018 13:04:33 +0000 (14:04 +0100)]
* eglot.el (eglot--lambda): add missing indent spec.
João Távora [Wed, 16 May 2018 23:30:53 +0000 (00:30 +0100)]
Simplify some function calling infrastructure
eglot--mapply is a confusing abstraction. Hide some of that confusion
behind eglot--lambda. More stably dispatch server notifications and
requests without introspecting their contents.
* eglot.el (eglot--process-receive): Simplify.
(eglot--async-request): Improve doc.
(eglot--request): Simplify.
(eglot--mapply): Remove.
(xref-backend-identifier-completion-table)
(xref-backend-definitions, xref-backend-references)
(xref-backend-apropos, eglot-completion-at-point)
(eglot-eldoc-function, eglot-imenu, eglot--apply-text-edits):
Don't use eglot--mapply, use normal mapcar/mapc.
João Távora [Wed, 16 May 2018 22:45:35 +0000 (23:45 +0100)]
Replace eglot--with-lsp-range with a function and pcase-let
* eglot.el (eglot--with-lsp-range): Remove.
(eglot--range-region): New function.
(eglot--server-textDocument/publishDiagnostics)
(eglot--hover-info, eglot-eldoc-function)
(eglot--apply-text-edits): Use it.
João Távora [Wed, 16 May 2018 22:39:12 +0000 (23:39 +0100)]
Simpler callback protocol for jsonrpc parameters and results
Instead of introspecting the :params or :result object to discover if
an object is present, and changing the Elisp function call type
(funcall vs apply) accordingly, alway funcall. It's up to the
application to destructure if it wishes. jrpc-lambda can help with
that and keep the application code simple.
* eglot.el (eglot--on-shutdown): Fix indentation.
(eglot--dispatch): Simplify.
(xref-backend-identifier-completion-table)
(xref-backend-definitions, xref-backend-references)
(xref-backend-apropos, eglot-completion-at-point)
(eglot-eldoc-function, eglot-imenu, eglot--apply-text-edits):
Don't use jrpc-mapply.
* jrpc.el (jrpc--process-receive): Allow only keys defined in
JSONRPC2.0
(jrpc--process-receive): Don't overload function call type based
on remote response.
(jrpc-lambda): Return a unary lambda.
(jrpc-request): Simplify.
(jrpc-mapply): Remove.
João Távora [Wed, 16 May 2018 13:21:27 +0000 (14:21 +0100)]
More flexible jrpc.el and improve eglot.el's doc
Generalize and rework CONTACT arg to jrpc-connect
* eglot.el (eglot--command-history): Tweak docstring.
(eglot--interactive): Rework.
(eglot): Rework docstring. COMMAND is now CONTACT.
(eglot--connect): Use new jrpc-connect protocol.
(eglot-server-programs): Reword doc.
* jrpc.el (jrpc--make-process): Use new form of CONTACT.
(jrpc-connect): Explain new semantics of CONTACT.
João Távora [Wed, 16 May 2018 00:21:36 +0000 (01:21 +0100)]
Merge master into jsonrpc-refactor (using imerge)
João Távora [Tue, 15 May 2018 12:24:08 +0000 (13:24 +0100)]
Add php's php-language-server to built-in guessed servers
Closes https://github.com/joaotavora/eglot/issues/1. The problem in that issue is that php-language-server has a
bug when it's not passed it the deprecated ":rootPath" field. The bug
doesn't happen if the ":processId" field is also absent. Eglot was
triggering the bug, because it didn't pass ":rootPath", but there's
nothing wrong in doing so.
* README.md: Add php-language-server to the built-in list.
* eglot.el (eglot-server-programs): Add php-language-server.
(eglot--connect): Also pass (deprecated) rootPath.
João Távora [Tue, 15 May 2018 09:59:46 +0000 (10:59 +0100)]
Bump version and slightly improve doc
* eglot.el: Bump version. Add nicer Commentary header.
(eglot): Improve docstring.
* README.md: Update
João Távora [Mon, 14 May 2018 22:58:29 +0000 (23:58 +0100)]
More quietly report request timeouts as events
* eglot.el (eglot--sync-request): Use eglot--log-event
João Távora [Mon, 14 May 2018 22:09:27 +0000 (23:09 +0100)]
Shutdown server if connection initialization fails
Also tweak autoreconnection logic
* eglot.el (eglot--connect): Immediately `eglot-shutdown` if
connection initialization failed. Don't treat interactive calls
specially.
(eglot--process-sentinel): Tweak messages.
João Távora [Mon, 14 May 2018 21:19:23 +0000 (22:19 +0100)]
Fix a ridiculous bug when generating transient projects
* eglot.el (eglot--find-current-process, eglot--interactive): Fix
horrible bug.
João Távora [Mon, 14 May 2018 21:17:00 +0000 (22:17 +0100)]
Fix a ridiculous bug when generating transient projects
* eglot.el (eglot--find-current-process, eglot--interactive): Fix
horrible bug.
João Távora [Mon, 14 May 2018 20:49:58 +0000 (21:49 +0100)]
Jrpc-connect is now passed a generic dispatching function
* eglot.el (eglot--dispatch): New helper.
(eglot--connect): Use it.
* jrpc.el (jrpc--dispatcher, jrpc--request-continuations)
(jrpc--server-request-ids): New process-local var.
(jrpc--pending-continuations, jrpc--method-prefix): Remove.
(jrpc-connect): Take DISPATCHER instead of PREFIX.
(jrpc--process-receive): Use proc's dispatcher.
(jrpc--process-send): Make private.
(jrpc-forget-pending-continuations, jrpc-async-request)
(jrpc-reply, jrpc-notify): Use new function names.
João Távora [Mon, 14 May 2018 19:06:44 +0000 (20:06 +0100)]
Merge master into jsonrpc-refactor (using imerge)
João Távora [Mon, 14 May 2018 18:19:12 +0000 (19:19 +0100)]
Proper server shutdown when jrpc.el is used
The shutdown hook can't be a buffer-local thing, it has
to be a server property. Also, on shutdown in eglot.el,
remember to first unmanage buffers and only then affect
eglot--processes-by-project.
* eglot.el (eglot--on-shutdown): reverse order of first
two sexps.
(eglot--connect): Pass a shutdown function to jrpc-connect
(eglot--managed-mode): Don't use jrpc-server-moribund-hook
(eglot--buffer-managed-p): Simplify. Use eglot--find-current-process.
João Távora [Mon, 14 May 2018 13:18:18 +0000 (14:18 +0100)]
Support didchangewatchedfiles with dynamic registration
RLS uses this, presumaly for knowing about Cargo.toml changes and stuff.
* README.md: Update protocol compliance.
* eglot.el (filenotify): Require it.
(eglot--file-watches): New process-local var.
(eglot--process-sentinel): Kill all watches
(eglot--register-unregister): New helper.
(eglot--server-client/registerCapability): Simplify.
(eglot--server-client/unregisterCapability): New method.
(eglot--register-workspace/didChangeWatchedFiles)
(eglot--unregister-workspace/didChangeWatchedFiles): New
capability.
(eglot--client-capabilities): Update.
João Távora [Mon, 14 May 2018 10:41:46 +0000 (11:41 +0100)]
Remove an unused variable
* eglot.el (eglot--expect-carriage-return): Get rid of this.
João Távora [Mon, 14 May 2018 10:20:37 +0000 (11:20 +0100)]
Now send willsavewaituntil
* eglot.el (eglot--client-capabilities): Report willSaveWaitUntil.
(eglot--server-workspace/applyEdit): Fix docstring.
(eglot--signal-textDocument/willSave): Send willSaveWaitUntil
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didClose): Don't eglot--obj.
(eglot--apply-text-edits): Simplify. Use current buffer.
(eglot--apply-workspace-edit): Use new eglot--apply-text-edits.
João Távora [Mon, 14 May 2018 09:50:49 +0000 (10:50 +0100)]
Don't define a menu if nothing to show there for now
* eglot.el (eglot-menu): Remove it.
(eglot--mode-line-format): Don't define a menu.
João Távora [Sun, 13 May 2018 22:25:15 +0000 (23:25 +0100)]
Use rls in travis ci and add actual tests
Also run a hook when connected
* eglot-tests.el (eglot--with-dirs-and-files)
(eglot--make-file-or-dirs, eglot--call-with-dirs-and-files)
(eglot--find-file-noselect): New helpers.
(auto-detect-running-server, auto-reconnect): New actual tests.
* eglot.el (eglot-connect): Run hook when connected
(eglot-connect-hook): New variable
* .travis.yml: Use rust stable and install rls
* README.md: Update mention of automated tests
João Távora [Sun, 13 May 2018 22:22:31 +0000 (23:22 +0100)]
Fix automatic project creation
* eglot.el (eglot): Take PROJECT arg. Return process.
(eglot--interactive): Returns a project.
João Távora [Sun, 13 May 2018 21:03:32 +0000 (22:03 +0100)]
Work with any old directory, no formal project needed
Actually, uses a "transient project" which project-current returns if
desperate.
* README.md: Update
* eglot.el (eglot--current-process)
(eglot--current-process-or-lose): Simplify.
(eglot): Maybe prompt user for project.
João Távora [Sun, 13 May 2018 19:35:45 +0000 (20:35 +0100)]
Ask server for textdocument/signaturehelp if it supports it
* eglot.el (eglot--client-capabilities): Capable of signature Help.
(eglot--sig-info): Helper for eglot-eldoc-function.
(eglot-eldoc-function): Send textDocument/signatureHelp
* README.md: Update to mention textDocument/signatureHelp
João Távora [Sat, 12 May 2018 21:05:20 +0000 (22:05 +0100)]
Fix copyright header. obviously not since 2003
João Távora [Sun, 13 May 2018 02:09:03 +0000 (03:09 +0100)]
Refactor json-rpc lib jrpc.el from eglot.el
* eglot.el [too many to mention]: Move lower level functions to
jrpc.el. Hook onto jrpc's external interfaces.
* jrpc.el: New file
João Távora [Sun, 13 May 2018 01:39:32 +0000 (02:39 +0100)]
Reinstate the catch/loop/throw idiom in eglot-request
This reverts parts of commit
fabee14ed5b32c30c6ac5cb1ce88f387522a6a1e.
Unfortunately, this may cause problems when calling the error
callbacks directly as in the process sentinel. In that particular
scenario the accept-process-output won't have return, because no
output has is being handled. Consequently, if we're unlucky, we have
another 30 seconds to way before the flag is tested and the loop
exits.
* eglot.el (eglot-request): Use catch/loop/throw again
João Távora [Sat, 12 May 2018 21:05:20 +0000 (22:05 +0100)]
Fix copyright header. obviously not since 2003
João Távora [Sat, 12 May 2018 14:59:53 +0000 (15:59 +0100)]
New command eglot-help-at-point and a readme update
* README.md (Commands and keybindings): New section.
* eglot.el (eglot-eldoc-function): Use eglot--hover-info.
Don't care about kind in highlightSymbol
(eglot--hover-info): New helper.
(eglot-help-at-point): New command.
João Távora [Fri, 11 May 2018 10:46:53 +0000 (11:46 +0100)]
Get rid of catch/loop/throw idiom (suggested by thien-thi nguyen)
* eglot.el (eglot--process-filter)
(eglot--request): Replace catch/loop/throw idiom with let/test/loop/set
João Távora [Fri, 11 May 2018 09:59:59 +0000 (10:59 +0100)]
Rework autoreconnection logic
Can't be a global var, has to be a per process thing.
* eglot.el (eglot-autoreconnect): New defcustom
(eglot--inhibit-autoreconnect): Renamed from eglot--inhibit-autoreconnect
(eglot--connect): Run autoreconnect timer here.
(eglot--inhibit-auto-reconnect): Removed.
(eglot--process-sentinel): Don't run timer here. Rework.
(eglot, eglot-reconnect): Pass INTERACTIVE to eglot--connect.
João Távora [Fri, 11 May 2018 01:03:10 +0000 (02:03 +0100)]
Duh, json.el is in emacs, and json-mode.el is useless here
* eglot.el (Package-Requires): Don't require json-mode
João Távora [Thu, 10 May 2018 21:40:32 +0000 (22:40 +0100)]
Prepare to sumbit to gnu elpa
* eglot.el: Update headers.
João Távora [Thu, 10 May 2018 21:56:11 +0000 (22:56 +0100)]
(eglot--xref-make): fix use of cl-destructuring-bind.
João Távora [Thu, 10 May 2018 21:04:59 +0000 (22:04 +0100)]
Misc little adjustments for readability
* eglot.el (eglot--log-event, eglot--process-receive)
(eglot--xref-make, xref-backend-apropos): Use cl-destructuring-bind.
(eglot--server-window/showMessageRequest): Compact.
João Távora [Thu, 10 May 2018 20:56:54 +0000 (21:56 +0100)]
Support :completionitem/resolve
This is quite handy with company and company-quickhelp
* eglot.el (eglot-completion-at-point): Send
:completionItem/resolve
* README.md: Mention completionItem/resolve
João Távora [Thu, 10 May 2018 20:31:37 +0000 (21:31 +0100)]
Rename functions. eglot--request is now the synchronous one
* eglot.el (eglot--connect, eglot-shutdown)
(xref-backend-identifier-completion-table)
(xref-backend-definitions, xref-backend-references)
(xref-backend-apropos, eglot-completion-at-point, eglot-rename):
Call eglot--request.
(eglot--async-request): Renamed from eglot--request.
(eglot--request): Renamed from eglot--sync-request.
(eglot--TextDocumentIdentifier)
(eglot--VersionedTextDocumentIdentifier)
(eglot--TextDocumentPositionParams, eglot--TextDocumentItem):
Renamed from the more verbose eglot--current-buffer-* variante.
(eglot-rename, eglot-imenu, eglot-eldoc-function)
(eglot-completion-at-point, xref-backend-definitions)
(xref-backend-identifier-at-point)
(eglot--signal-textDocument/didSave)
(xref-backend-identifier-completion-table)
(eglot--signal-textDocument/didClose)
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didChange): Use new function names.
João Távora [Thu, 10 May 2018 19:00:15 +0000 (20:00 +0100)]
Friendlier m-x eglot
* eglot.el (eglot-server-programs): Renamed from eglot-executables
(eglot--interactive): Redesign
(eglot): Docstring.
(eglot--connect): Now a synchronous gig.
(eglot--interactive): Friendlier.
(eglot): Improve docstring, rework a bit.
(eglot-reconnect): Rework a bit.
(eglot--process-sentinel): Insert "byebye" ruler here.
* README.md: Update
João Távora [Thu, 10 May 2018 18:23:56 +0000 (19:23 +0100)]
Improve eglot-eldoc-function
Use the :range key if the server provided it. Also simplify code with
a new eglot--with-lsp-range macro.
* eglot.el (eglot--format-markup): Tweak comment.
(eglot--with-lsp-range): New helper macro.
(eglot--server-textDocument/publishDiagnostics)
(eglot--apply-text-edits): Use it.
(eglot-eldoc-function): Use range if server provides it.
João Távora [Thu, 10 May 2018 17:44:47 +0000 (18:44 +0100)]
Reduce log chatter
* eglot.el (eglot--process-sentinel, eglot--request): Use
eglot--log-event.
(eglot--log-event): Print "message" if type unknown.
(eglot--debug, eglot--log): Remove.
(eglot--server-window/logMessage, eglot--server-telemetry/event):
Make noops.
(eglot--call-deferred): Also reduce chatter here.
João Távora [Thu, 10 May 2018 12:52:21 +0000 (13:52 +0100)]
Only call deferred actions after a full message has been received
Otherwise it can be quite wasteful.
* eglot.el (eglot--process-filter): Don't eglot--call-deferred here.
(eglot--process-receive): Do it here.
João Távora [Thu, 10 May 2018 12:14:19 +0000 (13:14 +0100)]
Resist server failure during synchronous requests
Calling the error handler unprotected could lead to the rest of the
sentinel not running at all. This defeated the auto-reconnection in
Rust, for example.
* eglot.el (eglot--process-sentinel): Rework.
João Távora [Thu, 10 May 2018 11:54:35 +0000 (12:54 +0100)]
Simplify mode-line updating logic
* eglot.el (eglot--define-process-var): Simplify.
(eglot--short-name, eglot--spinner, eglot--status): Don't
auto-update mode-line.
(eglot--process-receive): Update it here.
João Távora [Thu, 10 May 2018 11:51:21 +0000 (12:51 +0100)]
More rls-specifics: update flymake diags when indexing done
RLS could/should report diagnostics for every opened file, even if
there aren't any problems. Because it doesn't, loop for every buffer
managed by the process and call eglot--current-flymake-report-fn
* eglot.el
(eglot--server-window/progress): Call eglot--current-flymake-report-fn
João Távora [Thu, 10 May 2018 11:21:29 +0000 (12:21 +0100)]
Adjust flymake integration
When opening a new file (signalling textDocument/didOpen) it makes
sense to call the flymake callback (if it exists) with no diagnostics,
just to get rid of that "Wait", since we don't know if later in this
callback cycle the server will ever report new diagnostics.
* eglot.el (eglot--managed-mode): Don't call flymake-mode or eldoc-mode
(eglot--managed-mode-hook): Add them here.
(eglot--maybe-activate-editing-mode): Call flymake callback.
(eglot--server-textDocument/publishDiagnostics): Set unreported
diagnostics to nil if invoking callback.
João Távora [Thu, 10 May 2018 11:07:31 +0000 (12:07 +0100)]
Shorten summary line to appease package-lint.el
João Távora [Thu, 10 May 2018 11:07:11 +0000 (12:07 +0100)]
More correctly setup rust-mode-related autoloads
By autoloading the add-hook form and the eglot--setup-rls-idiosyncrasies
definition, a user can start rust-mode without loading eglot.el along
with it.
* eglot.el (rust-mode-hook)
(eglot--setup-rls-idiosyncrasies): Wrap in autoloaded progn.
João Távora [Wed, 9 May 2018 22:24:15 +0000 (23:24 +0100)]
Add minimal headers, commentary and autoloads
João Távora [Wed, 9 May 2018 22:12:19 +0000 (23:12 +0100)]
Fancier rls spinner
* eglot.el (eglot--mode-line-format): Use (nth 3) of
eglot--spinner.
(eglot--server-window/progress): Save detail message in spinner.
João Távora [Wed, 9 May 2018 21:41:37 +0000 (22:41 +0100)]
New "deferred requests" that wait until server is ready
Calling textDocument/hover or textDocument/documentHighlight before
the server has had a chance to process a textDocument/didChange is
normally useless. The matter is worse for servers like RLS which only
become ready much later and send a special notif for it (see
https://github.com/rust-lang-nursery/rls/issues/725).
So, keeping the same coding style add a DEFERRED arg to eglot--request
that makes it maybe not run the function immediately. Add a bunch of
logic for probing readiness of servers.
* README.md: Update
* eglot.el (eglot--deferred-actions): New process-local var.
(eglot--process-filter): Call deferred actions.
(eglot--request): Rewrite.
(eglot--sync-request): Rewrite.
(eglot--call-deferred, eglot--ready-predicates)
(eglot--server-ready-p): New helpers.
(eglot--signal-textDocument/didChange): Set spinner and call
deferred actions.
(eglot-completion-at-point): Pass DEFERRED to eglot-sync-request.
(eglot-eldoc-function): Pass DEFERRED to eglot-request
(eglot--rls-probably-ready-for-p): New helper.
(rust-mode-hook): Add eglot--setup-rls-idiosyncrasies
(eglot--setup-rls-idiosyncrasies): New helper.
João Távora [Wed, 9 May 2018 21:28:29 +0000 (22:28 +0100)]
Call eglot-eldoc-function after completion finishes
* eglot.el (eglot-completion-at-point): Call
eglot-eldoc-function after completion finishes.
João Távora [Wed, 9 May 2018 21:26:02 +0000 (22:26 +0100)]
Simplify `eglot-shutdown`
* eglot.el (eglot, eglot-reconnect)
(eglot--managed-mode): Call new eglot-shutdown.
(eglot-shutdown): Simplify.
(eglot--process-sentinel): Also call error functions.
(eglot--process-filter): Reindent.
João Távora [Wed, 9 May 2018 11:24:10 +0000 (12:24 +0100)]
Get rid of eglot-mode
* eglot.el (eglot--managed-mode): Don't call eglot-mode. When
shutting down, offer to kill server.
(mode-line-misc-info): Update to use eglot--managed-mode
João Távora [Wed, 9 May 2018 09:58:28 +0000 (10:58 +0100)]
Simplify eglot--signal-textdocument/didchange
* eglot.el (eglot--recent-before-changes)
(eglot--recent-after-changes): Delete.
(eglot--recent-changes): New var.
(eglot--outstanding-edits-p, eglot--before-change)
(eglot--after-change): Rewrite.
(eglot--signal-textDocument/didChange): Rewrite.
(eglot--signal-textDocument/didOpen): Initialize
buffer-local eglot--recent-changes here.
João Távora [Wed, 9 May 2018 01:43:47 +0000 (02:43 +0100)]
Fix odd bugs and tweak stuff
* eglot.el (eglot--log-event): Insert before markers.
(eglot--process-receive): Shave lines.
(xref-backend-references): Use cl-return-from.
(eglot--log-event): Simplify
(eglot-completion-at-point): Saner annotation
João Távora [Tue, 8 May 2018 15:07:07 +0000 (16:07 +0100)]
Support workspace/applyedit
* eglot.el (eglot--reply): Don't send result or error if not
provided.
(eglot--server-workspace/applyEdit): New server method.
(eglot--apply-text-edits): Rework.
(eglot--apply-workspace-edit): New helper.
(eglot-rename): Simplify.
João Távora [Tue, 8 May 2018 12:37:35 +0000 (13:37 +0100)]
Support textdocument/rename
* README.md: Mention rename support.
* eglot.el (eglot--uri-to-path): Handle uri hidden in keywords.
(eglot--apply-text-edits): New helper.
(eglot-rename): New interactive command.
(eglot--client-capabilities): Add rename capability.
João Távora [Tue, 8 May 2018 10:38:02 +0000 (11:38 +0100)]
Reasonable textdocument/documenthighlight support
* README.md: Update.
* eglot.el (eglot--current-buffer-TextDocumentPositionParams): New
helper.
(xref-backend-identifier-completion-table): Refactor a bit.
(xref-backend-identifier-at-point): Use when-let and
eglot--current-buffer-TextDocumentPositionParams
(xref-backend-definitions, xref-backend-references): Refactor a
bit.
(eglot-completion-at-point): Use
eglot--current-buffer-TextDocumentPositionParams
(eglot-eldoc-function): Rewrite to handle
textDocument/documentHighlight.
(eglot--highlights): New variable.
(eglot--client-capabilities): Update with support for documentHighlight.
João Távora [Tue, 8 May 2018 01:05:03 +0000 (02:05 +0100)]
Fix odd bugs
* eglot.el (eglot--process-receive, eglot--request): Set status to
actual error message.
(eglot--managed-mode): Manage imenu-create-index-function
correctly.
(eglot--mode-line-format): Print error status.
João Távora [Tue, 8 May 2018 00:52:27 +0000 (01:52 +0100)]
When killing server, always wait 3 seconds
* eglot.el (eglot--request): Accept TIMEOUT param.
João Távora [Tue, 8 May 2018 00:46:30 +0000 (01:46 +0100)]
Try to fix some textdocument/completion bugs
* eglot.el (eglot-completion-at-point): Rework slightly.
João Távora [Mon, 7 May 2018 22:43:03 +0000 (23:43 +0100)]
Half-decent imenu support via textdocument/documentsymbol
* README.md: Update capability
* eglot.el (eglot--lsp-position-to-point): New function.
(eglot--managed-mode): Handle imenu-create-index-function.
(eglot--server-textDocument/publishDiagnostics): Use
eglot--lsp-position-to-point.
(eglot-imenu): New function.
(eglot--client-capabilities): Capable of documentSymbol.
João Távora [Mon, 7 May 2018 21:56:20 +0000 (22:56 +0100)]
Only request stuff that server says it's capable of
* eglot.el (eglot--server-capable): New helper.
(eglot-xref-backend)
(xref-backend-identifier-completion-table)
(xref-backend-references, xref-backend-apropos)
(eglot-completion-at-point, eglot-eldoc-function): Use it.
João Távora [Mon, 7 May 2018 21:40:53 +0000 (22:40 +0100)]
Simplify mode-line code with a helper.
* eglot.el (eglot--mdoe-line-props): New helper.
(eglot--mode-line-format): Use it.
João Távora [Mon, 7 May 2018 21:16:28 +0000 (22:16 +0100)]
Get rid of eglot--buffer-open-count
Hasn't really proved useful yet.
* eglot.el (eglot--buffer-open-count): Remove.
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didClose): Simplify.
João Távora [Mon, 7 May 2018 21:15:21 +0000 (22:15 +0100)]
Get rid of eglot--special-buffer-process
Hasn't really proved useful yet.
* eglot.el (eglot--special-buffer-process): Delete.
(eglot--current-process): Simplify.
(eglot--events-buffer): Simplify.
João Távora [Mon, 7 May 2018 21:14:06 +0000 (22:14 +0100)]
* eglot.el: reformat to shave off some lines.
João Távora [Mon, 7 May 2018 21:06:49 +0000 (22:06 +0100)]
Fix bug in hover support
* eldoc.el (eglot-eldoc-function): Use eglot--format-markup.
(subr-x): Require it.
(eglot--format-markup): Pacify byte-compiler.
João Távora [Mon, 7 May 2018 17:46:28 +0000 (18:46 +0100)]
Clean up client capabilities
* eglot.el (eglot--client-capabilities): Clean up client
capabilities.
João Távora [Mon, 7 May 2018 17:45:57 +0000 (18:45 +0100)]
Half-baked textdocument/hover support
* eglot.el (eglot--format-markup): New helper.
(eglot--managed-mode): Handle eldoc-documentation-function.
(eglot-eldoc-function): New function.
* README.md: update
João Távora [Mon, 7 May 2018 17:43:30 +0000 (18:43 +0100)]
Tweak the async request engine.
* eglot.el (eglot--request): Return the continuation id.
(eglot--lambda): Move up in the file.
(eglot--sync-request): Use a catch-tag.
João Távora [Mon, 7 May 2018 16:27:01 +0000 (17:27 +0100)]
Explain why didopen on after-revert-hook is a bad idea
The reason is that the global find-file-hook is called again, and that
already does the didOpen. Too many didOpen's would be bad.
* eglot.el (eglot--managed-mode): Remove commented lines.
João Távora [Mon, 7 May 2018 16:23:27 +0000 (17:23 +0100)]
Half-decent completion support
* README.md: Update.
* eglot.el (eglot--kind-names): New variable.
(eglot--managed-mode): Handle completion-at-point-functions.
(eglot-completion-at-point): New function.
João Távora [Mon, 7 May 2018 15:32:23 +0000 (16:32 +0100)]
Solve another textdocument/didchange bug
* eglot.el (eglot--signal-textDocument/didChange): Rework a bit.
(eglot--after-change): Store the actual after-text in the
eglot--recent-after-changes.
João Távora [Mon, 7 May 2018 14:04:02 +0000 (15:04 +0100)]
Support javascript's javascript-typescript-langserver
* README.md: Improve a bit
* eglot.el (eglot--make-process): Take MANAGED-MAJOR-MODE arg
(eglot-executables): Add basic javascript support.
(eglot--connect): Pass mode to eglot--make-process
(eglot--interactive): Check that guessed command is a listp.
(eglot): Minor improvement to message.
(eglot--current-buffer-TextDocumentItem): Guess language from mode
symbol.
João Távora [Mon, 7 May 2018 12:45:10 +0000 (13:45 +0100)]
Increase request timeout length to 10 seconds
* eglot.el (eglot-request-timeout): New var.
(eglot--request): Use it.
João Távora [Mon, 7 May 2018 12:42:56 +0000 (13:42 +0100)]
Workaround two suspected emacs bugs
* eglot.el (eglot--process-filter): Use a proper unique tag. Use
unwind-protect.
(eglot--sync-request): Rework.
(eglot--server-client/registerCapability): Use a proper done tag.
João Távora [Mon, 7 May 2018 11:18:08 +0000 (12:18 +0100)]
Etoomanylambdas
* eglot.el (eglot--sync-request): Remove a lambda.
João Távora [Mon, 7 May 2018 10:53:44 +0000 (11:53 +0100)]
Fix the odd bug here and there
* eglot.el (eglot--connect): Activate editing mode where
applicable here.
(eglot, eglot-reconnect): Not here or here.
(eglot--process-sentinel): Catch auto-reconnect errors.
(eglot--notify): Dont send 'id=null', it messes up js's lsp
(eglot--reply): Do send id here.
(eglot--log-event): Simplify protocol. Complexify implementation.
(eglot--process-receive, eglot--process-send): Simplify
eglot--log-event call.
(eglot--request, eglot--notify, eglot--reply): Simplify
eglot--process-send call
(eglot--server-client/registerCapability): Fix bug when replying
with wrong id.
(eglot--xref-reset-known-symbols): Take DUMMY arg.